#include <string>
#include <list>
#include <iostream>
using namespace std;

// 将list中值为4的元素删除
void test(){
    list<int> vec = {1,2,3,4,4,4,4,5,4,4,6};
    for(auto it = vec.begin(); it != vec.end(); it++){
        if(4 == *it){
            // 如果这个数是4就使用erase删除
            vec.erase(it);
        }
    }
    // 会出现问题：指针丢失
    // 在每次进行删除之后it指针
    // 它所指向的位置是被释放的
    // 这样it指针就丢失了，没有进行正确的后移操作
    // 要是没有丢失，这样写也会出现之前vector中
    // 出现过的那个迭代器失效的问题
    for(auto & elm : vec){
        cout  << elm << " ";
    }
    cout << endl;
}

void test1(){
    list<int> vec = {1,2,3,4,4,4,4,5,4,6,7,8,4,4,9,10};
    for(auto it = vec.begin(); it != vec.end();){
        if(4 == *it){
            // 如果这个数是4就使用erase删除
            it = vec.erase(it);
        }else{

            it++;
        }
    }
    // 这样就不会出现上面的问题
    // 对于 erase()来说他有返回值
    // 他会返回该被删除元素的下一个元素的指针
    // 这样就不会出现指针丢失的问题了
    for(auto & elm : vec){
        cout  << elm << " ";
    }
    cout << endl;
}

int main(int atgc, char * argv[])
{
    test1();
    return 0;
}

